Muitas vezes no aprendizado de máquina o objetivo é encontrar padrões nos dados sem tentar fazer previsões, isso é chamado de aprendizagem não supervisionada. É comum usar a aprendizagem não supervisionada para agrupar consumidores com base em dados demográficos e histórico de compras para campanhas de marketing direcionadas. Outro exemplo é querer descrever os fatores não medidos que mais influenciam as diferenças entre cidades. Este tutorial é uma introdução básica às técnicas de cluster e redução de dimensionalidade em R a partir de uma perspectiva de aprendizado de máquina.
O algoritmo k-means é amplamente usado para realizar a tarefa de cluster nos dados (cluster = “agrupamento” em português). Problemas que demandam realizar clusters são: * Determinar agrupamentos de casas para venda com base no tamanho, número de quartos, etc; * Determinar se há padrões comuns de demografia de pessoas para um segmento do mercado;
Vou usar o dataset “x” no qual possui duas dimensões que usarei para criar um modelo de k-means usando 3 clusters, em seguida examinarei a estrutura do modelo resultante usando a função summary().
# carregando os dados
library(readxl) # pacote necessário para ler o arquivo
x <- read_xlsx("x.xlsx", sheet = 1)
# criando o modelo de k-means: km.out
km.out <- kmeans(x, centers = 3, nstart = 20)
# verificando o modelo
summary(km.out)
## Length Class Mode
## cluster 300 -none- numeric
## centers 6 -none- numeric
## totss 1 -none- numeric
## withinss 3 -none- numeric
## tot.withinss 1 -none- numeric
## betweenss 1 -none- numeric
## size 3 -none- numeric
## iter 1 -none- numeric
## ifault 1 -none- numeric
A função kmeans() produz várias saídas. A seguir, acessarei a componente do cluster diretamente. Isso é útil sempre que você precisar da associação de cluster para cada observação dos dados usados para construir o modelo de armazenamento em cluster. Mais adiante mostrarei um exemplo de como essa associação de cluster pode ser usada para ajudar a comunicar os resultados da modelagem k-means.
Nos modelos k-means é possível visualizarmos os resultados da modelagem usando a função print() ou simplesmente digitando o nome do modelo.
# visualizando a componente de cluster
km.out$cluster
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [36] 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1
## [71] 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
## [106] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [141] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [176] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [211] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [246] 2 2 2 2 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1
## [281] 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 1 3 3
# visualizando a saída do modelo
km.out
## K-means clustering with 3 clusters of sizes 98, 150, 52
##
## Cluster means:
## x y
## 1 2.2170408 2.05153061
## 2 -5.0554667 1.96973333
## 3 0.6642308 -0.09115385
##
## Clustering vector:
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [36] 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1
## [71] 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
## [106] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [141] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [176] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [211] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [246] 2 2 2 2 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1
## [281] 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 1 3 3
##
## Within cluster sum of squares by cluster:
## [1] 148.7013 295.1237 95.4708
## (between_SS / total_SS = 87.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss"
## [5] "tot.withinss" "betweenss" "size" "iter"
## [9] "ifault"
### 1.1) Visualizando clusters
Uma das maneiras mais intuitivas de interpretar os resultados dos modelos k-means é plotando os dados como um gráfico de dispersão e usando cores para rotular a associação de cluster das amostras. Vou usar a função plot() padrão para realizar isso.
# gráfico de dispersão x
plot(x, col = km.out$cluster,
main = "k-means with 3 clusters",
xlab = "", ylab = "")
A função kmeans() gera aleatoriamente os centros de clusters, essa aleatoriedade pode resultar em diferentes cluster a cada vez que executar o modelo. Além disso, essa geração aleatória pode resultar em diferentes locais mínimos para o algoritmo k-means. A seguir vou demonstrar os dois resultados.
No topo de cada gráfico, a medida da qualidade do modelo será plotada, assim podemos ver os modelos com os melhores resultados.
Como o kmeans() gera as observações para clusters aleatoriamente, é importante definir o gerador de números aleatórios para podermos reproduzir o resultado do modelo.
# configurando a grade de 2x3
par(mfrow = c(2, 3))
# para reprodução dos resultados do modelo
set.seed(1)
for(i in 1:6) {
# rodando o kmeans() com 3 clusters 1 começo
km.out <- kmeans(x, centers = 3, nstart = 1)
# visualizando os clusters
plot(x, col = km.out$cluster,
main = km.out$tot.withinss,
xlab = "", ylab = "")
}
Por conta da geração aleatória do algoritmo k-means, há bastante variação entre as métricas de qualidade do cluster entre os seis modelos.
O algoritmo k-means assume o número de clusters como parte do input. Se você souber antecipadamente o número de clusters (por exemplo, devido a certas características do negócio), isso facilita a configuração do número de clusters. No entanto, se não souber o número de clusters e precisar determiná-lo, será necessário executar o algoritmo várias vezes, cada vez com um número diferente de clusters. A partir disso, você pode observar como a métrica da qualidade do modelo muda com o número de clusters.
A seguir vou executar o kmeans() várias vezes para ver como a qualidade do modelo é alterada conforme o número de clusters é alterado. Os gráficos que exibem essas informações ajudam a determinar o número de clusters e são geralmente chamados de scree plot.
O ideal é visualizar um cotovelo onde a métrica de qualidade melhora mais lentamente à medida que o número de agrupamentos aumenta. Isso indica que a qualidade do modelo não está mais melhorando substancialmente à medida que a complexidade do modelo (ou seja, o número de clusters) aumenta. Em outras palavras, o cotovelo indica o número de clusters inerentes aos dados.
# começando com a soma total dos erros ao quadrado: wss
wss <- 0
# de 1 a 15 centros de cluster
for (i in 1:15) {
km.out <- kmeans(x, centers = i, nstart = 20)
# salvando a soma total dos quadrados no objeto wss
wss[i] <- km.out$tot.withinss
}
# visualizando a soma total dos quadrados X o número de clusters
plot(1:15, wss, type = "b",
xlab = "Number of Clusters",
ylab = "Within groups sum of squares")
# configurando o k
k <- 2 # 3 também seria ok
Olhando para o scree plot parece que existem 2 ou 3 clusters nos dados.
Lidar com dados reais costuma ser mais desafiador do que lidar com dados sintéticos. Os dados sintéticos ajudam a aprender novos conceitos e técnicas, mas a seguir vamos lidar com dados mais reais, no qual podemos encontrar em nossas atividades profissionais ou acadêmicas.
Usarei aqui os dados do Pokemon disponível no site do kaggle. O primeiro desafio com os dados do Pokemon é que não há um número pré-determinado de clusters. Você determinará o número apropriado de grupos, tendo em mente que, em dados reais, o cotovelo do scree plot pode ser saliente do que em dados sintéticos. Use seu julgamento para determinar o número de clusters se quiser.
Uma observação adicional: este exercício utiliza o argumento iter.max para kmeans(). Como você viu, kmeans() é um algoritmo iterativo, repetindo várias vezes até que algum critério de parada seja atingido. O número padrão de iterações para kmeans() é 10, o que não é suficiente para o algoritmo convergir e atingir seu critério de parada, portanto, definiremos o número de iterações como 50 para superar esse problema. Para ver o que acontece quando o kmeans() não converge, tente executar o exemplo com um número menor de iterações (por exemplo, 3). Este é outro exemplo do que pode acontecer quando você trabalha com dados reais.
# importando os dados do pokemon
pokemon <- read.csv("Pokemon.csv", sep = ",")
pokemon1 <- pokemon[,6:11]
# começando com a soma total dos erros ao quadrado: wss
wss <- 0
# de 1 a 15 centros de cluster
for (i in 1:15) {
km.pokemon <- kmeans(pokemon1, centers = i, nstart = 20, iter.max = 50)
# salvando a soma total dos quadrados no objeto wss
wss[i] <- km.pokemon$tot.withinss
}
# visualizando a soma total dos quadrados X o número de clusters
plot(1:15, wss, type = "b",
xlab = "Number of Clusters",
ylab = "Within groups sum of squares")
# selecionando o número de clusters (pode ser 2, 3 ou 4...)
k <- 3
# construindo o modelo com k clusters: km.out
km.pokemon <- kmeans(pokemon1, centers = k, nstart = 20, iter.max = 50)
# visualizando os resultados do modelo
km.pokemon
## K-means clustering with 3 clusters of sizes 353, 177, 270
##
## Cluster means:
## HitPoints Attack Defense SpecialAttack SpecialDefense Speed
## 1 54.62890 56.99433 53.38810 52.02833 52.87252 53.66572
## 2 79.14689 96.71751 108.81921 66.53672 87.01130 57.09605
## 3 81.90370 96.15926 77.65556 104.12222 86.87778 94.71111
##
## Clustering vector:
## [1] 1 1 3 3 1 1 3 3 3 1 1 2 3 1 1 1 1 1 1 3 1 1 3 3 1 1 1 3 1 3 1 3 1 2 1
## [36] 1 2 1 1 3 1 3 1 3 1 1 1 3 1 1 3 1 2 1 3 1 1 1 3 1 3 1 3 1 3 1 1 2 1 3
## [71] 3 3 1 2 2 1 1 3 1 3 1 2 2 1 3 1 2 2 1 3 1 1 3 1 2 1 2 1 2 1 3 3 3 2 1
## [106] 2 1 2 1 3 1 3 1 2 2 2 1 1 2 1 2 1 2 2 2 1 3 1 2 1 3 3 3 3 3 3 2 2 2 1
## [141] 2 2 2 1 1 3 3 3 1 1 2 1 2 3 3 2 3 3 3 1 1 3 3 3 3 3 1 1 2 1 1 3 1 1 2
## [176] 1 1 1 3 1 1 1 1 3 1 3 1 1 1 1 1 1 3 1 1 3 3 2 1 2 2 3 1 1 3 1 1 1 1 1
## [211] 2 3 2 1 2 3 1 1 3 1 2 1 2 2 2 1 2 1 2 2 2 2 2 1 1 2 1 2 1 2 1 1 3 1 3
## [246] 2 1 3 3 3 1 2 3 3 1 1 2 1 1 1 2 3 3 3 2 1 1 2 2 3 3 3 1 1 3 3 1 1 3 3
## [281] 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 2 1 1 3 3 1 1 1 2 1 1 3 1
## [316] 3 1 1 1 3 1 2 1 2 1 1 1 2 1 2 1 2 2 2 1 1 3 1 3 3 1 1 1 1 1 1 2 1 3 3
## [351] 1 3 1 3 2 2 1 3 1 1 1 3 1 3 1 2 3 3 3 3 2 1 2 1 2 1 2 1 2 1 2 1 3 1 2
## [386] 1 3 3 1 2 2 1 3 3 1 1 3 3 1 1 3 1 2 2 2 1 1 2 3 3 1 2 2 3 2 2 2 3 3 3
## [421] 3 3 3 2 3 3 3 3 3 3 2 3 1 2 2 1 1 3 1 1 3 1 1 3 1 1 1 1 1 1 3 1 3 1 2
## [456] 2 2 1 2 2 2 3 1 2 1 1 3 1 3 1 2 3 1 3 1 3 3 3 3 1 3 1 1 3 1 2 1 1 1 1
## [491] 2 1 1 3 3 1 1 3 3 1 2 1 2 1 3 2 1 3 1 1 3 2 3 3 2 2 2 3 3 3 3 2 3 2 3
## [526] 3 3 3 2 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 1 3 1 1 3
## [561] 1 1 3 1 1 1 1 2 1 3 1 3 1 3 1 3 1 2 1 1 3 1 3 1 2 2 1 3 1 3 2 2 1 2 2
## [596] 1 1 3 2 2 1 1 3 1 1 3 1 3 1 3 3 1 1 3 1 2 3 3 1 2 1 2 3 1 2 1 2 1 3 1
## [631] 2 1 3 1 3 1 1 2 1 1 3 1 3 1 1 3 1 3 3 1 2 1 2 1 3 2 1 3 1 2 1 2 2 1 1
## [666] 3 1 3 1 1 3 1 2 2 1 2 3 1 3 2 1 3 2 1 2 1 2 2 1 2 1 2 3 2 1 1 3 1 3 3
## [701] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 2 2 1 1 3 1 1 3 1 1 1 1 3 1 1 1
## [736] 1 3 1 1 3 1 3 1 2 3 1 3 3 1 2 3 2 1 2 1 3 1 2 1 2 1 2 1 3 1 3 1 2 1 3
## [771] 3 3 3 2 1 3 3 2 1 2 1 1 1 1 2 2 2 2 1 2 1 3 3 3 2 2 3 3 3 3
##
## Within cluster sum of squares by cluster:
## [1] 801589.7 719519.6 1018348.0
## (between_SS / total_SS = 40.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss"
## [5] "tot.withinss" "betweenss" "size" "iter"
## [9] "ifault"
# visualizando os clusters de defesa X velocidade
plot(pokemon[, c("Defense", "Speed")],
col = km.pokemon$cluster,
main = paste("k-means clustering of Pokemon with", k, "clusters"),
xlab = "Defense",
ylab = "Speed")
O clustering hierárquico é outro método popular de clustering. O objetivo deste capítulo é mostrar como ele funciona, como usá-lo e como ele se compara ao k-means.
A seguir vou criar o nosso primeiro modelo de clustering hierárquico usando a função hclust(). Usarei o dataset “z” para criar um modelo de clustering hierárquico. O primeiro passo para o modelo de clustering hierárquico é determinar a similaridade entre observações, usando a função dist(). Ao final vou examinar a estrutura do modelo resultante usando a função summary().
# carregadno o dataset z
z <- read_xlsx("z.xlsx", sheet = 1)
# criando o modelo de clustering hierárquico
hclust.out <- hclust(dist(z))
# verificando os resultados
summary(hclust.out)
## Length Class Mode
## merge 96 -none- numeric
## height 48 -none- numeric
## order 49 -none- numeric
## labels 0 -none- NULL
## method 1 -none- character
## call 2 -none- call
## dist.method 1 -none- character
Agora que criamos nosso primeiro modelo de clustering hierárquico, vamos aprender como usá-lo para resolver problemas.
Usaremos a função cutree() que corta horizontalmente o modelo hierárquico. Os argumentos h e k do cutree() permitem cortar a árvore com base em uma certa altura h ou com um determinado número de clusters k. A seguir vou usar o cutree() para cortar o modelo hierárquico criado anteriormente com base em cada um desses dois critérios.
# podando pela altura
cutree(hclust.out, h = 7)
## [1] 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1
## [36] 1 1 1 1 1 2 1 1 1 1 1 1 1 1
# podando pelo número de clusters
cutree(hclust.out, k = 3)
## [1] 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3
## [36] 1 1 1 3 3 2 3 3 3 3 3 3 1 3
Se você está se perguntando o que significa esse output, lembre-se, existem 50 observações no dataset x. O output do cutree() representa as atribuições de cluster para cada observação no dataset original ;)
Agora vou explorar modelos de clustering hierárquico usando diferentes métodos de ligação e vou plotar o dendrograma de cada um, para observarmos a estrutura geral das árvores.
# cluster usando a ligação "complete"
hclust.complete <- hclust(dist(z), method = "complete")
# cluster usando a ligação "average"
hclust.average <- hclust(dist(z), method = "average")
# cluster usando a ligação "single"
hclust.single <- hclust(dist(z), method = "single")
# plotando o dendograma que usa a ligação "complete"
plot(hclust.complete, main = "Complete")
# plotando o dendograma que usa a ligação "average"
plot(hclust.average, main = "Average")
# plotando o dendograma que usa a ligação "single"
plot(hclust.single, main = "Single")
Antes de continuarmos, verifique os gráficos para comparar os três dendrogramas, vou explicar a seguir sobre as implicações dessas diferenças!
É visível que as ligações “complete” e “average” produzem clusters mais equilibrados. Ter árvores balanceadas ou não balanceadas para seu modelo hierárquico de clustering, vai depender do contexto do problema que você está tentando resolver. Árvores equilibradas são essenciais se você quer um número par de observações atribuídas a cada cluster. Por outro lado, se você quiser detectar valores discrepantes por exemplo, uma árvore desequilibrada é mais adequada porque a remoção de uma árvore não balanceada pode resultar na maioria das observações atribuídas a um cluster, e apenas algumas observações atribuídas a outros clusters.
Lembre-se de que os dados reais em cluster podem exigir o dimensionamento dos recursos se eles tiverem distribuições diferentes. Até agora, trabalhei com dados sintéticos que não precisam de escalonamento.
A seguir voltarei a trabalhar com dados reais, usarei o dataset pokemon novamente. Vamos observar a distribuição (média e desvio padrão) de cada recurso, dimensionar os dados de acordo, e em seguida produzir um modelo de agrupamento hierárquico usando o método de ligação completo.
# verificando a média das colunas do dataset
colMeans(pokemon[6:11])
## HitPoints Attack Defense SpecialAttack SpecialDefense
## 69.25875 79.00125 73.84250 72.82000 71.90250
## Speed
## 68.27750
# verificando o desvio padrão das compenentes do dataset
apply(pokemon[6:11], 2, sd)
## HitPoints Attack Defense SpecialAttack SpecialDefense
## 25.53467 32.45737 31.18350 32.72229 27.82892
## Speed
## 29.06047
# escalonando os dados
pokemon.scaled <- scale(pokemon[6:11])
# criando o modelo de clustering hierárquico
hclust.pokemon <- hclust(dist(pokemon.scaled), method = "complete")
Vamos rapidamente recapitular o que acabei de fazer: 1) Verifiquei primeiro se as médias das colunas e os desvios padrão variam; 2) Por causa disso, escalei os dados; 3) Converti os dados escalados para uma matriz de similaridade e as passei para a função hclust()
Agora vou comparar o k-means e o clustering hierárquico, vamos ver como esses dois métodos produzem diferentes associações de cluster. Isso ocorre porque os dois algoritmos fazem suposições diferentes sobre como os dados são gerados. A seguir vou comparar os resultados dos dois modelos do dataset pokemon para ver como eles são diferentes.
# aplicando a função cutree() no hclust.pokemon
cut.pokemon <- cutree(hclust.pokemon, k = 3)
# comparando os métodos
table(km.pokemon$cluster, cut.pokemon)
## cut.pokemon
## 1 2 3
## 1 348 5 0
## 2 173 3 1
## 3 267 3 0
Olhando para a tabela, parece que o modelo de clustering hierárquico atribui a maioria das observações ao cluster 1, enquanto o algoritmo k-means distribui as observações de forma relativamente uniforme entre todos os clusters. É importante notar que não há consenso sobre qual método produz melhores clusters. O trabalho do analista para o clustering não supervisionado é observar as atribuições do cluster e fazer uma avaliação de quanto cada método fornece mais insights sobre os dados!
Trabalhando como cientista de dados, frequentemente você terá que lidar com datasets desordenados e com alta dimensão. A seguir mostrarei como usar a PCA (Principal Component Analysis) para reduzir efetivamente a dimensionalidade desses tipos de datasets, de modo que fique mais fácil extrair insights deles.
Bom, mas o que a PCA faz?
Conceitualmente existem 5 passos para realizar a PCA:
A (1) centralização e a (2) padronização são duas etapas necessárias na fase de pré-processamento, a (3) rotação e a (4) projeção expressam a mudança no sistema de coordenadas para um novo sistema de coordenadas com as componentes principais nos seus eixos, e finalmente, nós podemos (5) reduzir a dimensionalidade dos dados baseada na variância explicada das componentes principais.
A centralização e padronização essencialmente movem os dados para diferentes posições dentro do mesmo sistema de coordenadas, no entanto, deixando a forma da nuvem de pontos inalterada:
Os próximos dois passos implementam a mudança de perspectiva das variáveis originais para as componentes principais, cada um dos novos componentes extraídos é ortogonal ao anterior, e por fim acabaremos com uma nova representação não-reduzida dos dados, em que os eixos x e y correspondem aos dois primeiros componentes principais extraídos:
Reduzir a dimensionalidade dos dados envolve uma decisão sobre quais das novas dimensões podemos manter e ainda explicar a maior parte da variação. O scree plot é um gráfico que coloca as componentes principais recém extraídas em ordem decrescente com base na porcentagem de variância explicada. Quase 85% da variação nos dados originais é explicada pelos dois primeiros componentes. Isso é um bom sinal, pois usar apenas duas das onze dimensões do dataset mtcars nos deixa mais tranquilo em relação a perda de informação.
O R possui a função prcomp() para realizar a PCA sobre os dados, o output dessa função contém um índice com a carga das variáveis. Como exemplo usarei um mtcars para demonstrar:
# PCA com prcomp()
mtcars_pca <- prcomp(mtcars)
mtcars_pca
## Standard deviations (1, .., p=11):
## [1] 136.5330479 38.1480776 3.0710166 1.3066508 0.9064862
## [6] 0.6635411 0.3085791 0.2859604 0.2506973 0.2106519
## [11] 0.1984238
##
## Rotation (n x k) = (11 x 11):
## PC1 PC2 PC3 PC4 PC5
## mpg -0.038118199 0.009184847 0.982070847 0.047634784 -0.08832843
## cyl 0.012035150 -0.003372487 -0.063483942 -0.227991962 0.23872590
## disp 0.899568146 0.435372320 0.031442656 -0.005086826 -0.01073597
## hp 0.434784387 -0.899307303 0.025093049 0.035715638 0.01655194
## drat -0.002660077 -0.003900205 0.039724928 -0.057129357 -0.13332765
## wt 0.006239405 0.004861023 -0.084910258 0.127962867 -0.24354296
## qsec -0.006671270 0.025011743 -0.071670457 0.886472188 -0.21416101
## vs -0.002729474 0.002198425 0.004203328 0.177123945 -0.01688851
## am -0.001962644 -0.005793760 0.054806391 -0.135658793 -0.06270200
## gear -0.002604768 -0.011272462 0.048524372 -0.129913811 -0.27616440
## carb 0.005766010 -0.027779208 -0.102897231 -0.268931427 -0.85520810
## PC6 PC7 PC8 PC9 PC10
## mpg -0.143790084 -0.039239174 2.271040e-02 -0.002790139 0.030630361
## cyl -0.793818050 0.425011021 -1.890403e-01 0.042677206 0.131718534
## disp 0.007424138 0.000582398 -5.841464e-04 0.003532713 -0.005399132
## hp 0.001653685 -0.002212538 4.748087e-06 -0.003734085 0.001862554
## drat 0.227229260 0.034847411 -9.385817e-01 -0.014131110 0.184102094
## wt -0.127142296 -0.186558915 1.561907e-01 -0.390600261 0.829886844
## qsec -0.189564973 0.254844548 -1.028515e-01 -0.095914479 -0.204240658
## vs 0.102619063 -0.080788938 -2.132903e-03 0.684043835 0.303060724
## am 0.205217266 0.200858874 -2.273255e-02 -0.572372433 -0.162808201
## gear 0.334971103 0.801625551 2.174878e-01 0.156118559 0.203540645
## carb -0.283788381 -0.165474186 3.972219e-03 0.127583043 -0.239954748
## PC11
## mpg -0.0158569365
## cyl 0.1454453628
## disp 0.0009420262
## hp -0.0021526102
## drat -0.0973818815
## wt -0.0198581635
## qsec 0.0110677880
## vs 0.6256900918
## am 0.7331658036
## gear -0.1909325849
## carb 0.0557957968
O pacote FactorMineR que nós usaremos nesse tutorial oferece a coleção mais completa de métodos de extração/estimativa para PCA, a função PCA() usa um conjunto de dados ou matriz de correlação e gera dois gráficos e uma série de índices informativos para cinco dimensões. A PCA(), ao contrário de prcomp(), não retorna as cargas, mas as coordenadas das variáveis na nova representação de dados.
# carregando o FactorMineR
library(FactoMineR)
# PCA com PCA() do FactorMineR
mtcars_pca <- PCA(mtcars)
mtcars_pca
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 32 individuals, described by 11 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
Agora vamos nos concentrar no mapa de fatores da variável para interpretar o modelo de PCA. Na primeira componente principal (eixo horizontal), variáveis como cyl (número de cilindros), wt (peso) e disp (deslocamento em polegadas cúbicas) possuem valores positivos e estão localizadas na extremidade direita, enquanto mpg (milhas por galão) fica no lado exatamente oposto, tendo valores negativos. Uma explicação plausível é que a primeira componente principal separa carros que são “potentes e pesados” do lado direito, daqueles que são “econômicos e leves” no lado esquerdo. A segunda componente principal parece revelar outra característica oculta do dataset mtcars relacionada a velocidade. Os carros com muitas marchas são colocados mais ao alto, enquanto os mais lentos, que têm valores mais altos para qsec (1/4 de milha), possuem valores mais baixos na segunda componente principal.
A propriedade eig da PCA() gera uma matriz com três colunas, sendo as mais importantes as porcentagens de variância explicada e variância acumulada explicada pelos componentes principais.
mtcars_pca$eig
## eigenvalue percentage of variance
## comp 1 6.60840025 60.0763659
## comp 2 2.65046789 24.0951627
## comp 3 0.62719727 5.7017934
## comp 4 0.26959744 2.4508858
## comp 5 0.22345110 2.0313737
## comp 6 0.21159612 1.9236011
## comp 7 0.13526199 1.2296544
## comp 8 0.12290143 1.1172858
## comp 9 0.07704665 0.7004241
## comp 10 0.05203544 0.4730495
## comp 11 0.02204441 0.2004037
## cumulative percentage of variance
## comp 1 60.07637
## comp 2 84.17153
## comp 3 89.87332
## comp 4 92.32421
## comp 5 94.35558
## comp 6 96.27918
## comp 7 97.50884
## comp 8 98.62612
## comp 9 99.32655
## comp 10 99.79960
## comp 11 100.00000
cos2 significa cosseno ao quadrado e é um índice para a qualidade de representação de variáveis e indivíduos, quanto mais próximo este valor for de um, melhor será a qualidade.
mtcars_pca$var$cos2
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg 0.8685312 0.0006891117 0.031962249 1.369725e-04 0.0023634487
## cyl 0.9239416 0.0050717032 0.019276287 1.811054e-06 0.0007642822
## disp 0.8958370 0.0064482423 0.002370993 1.775235e-02 0.0346868281
## hp 0.7199031 0.1640467049 0.012295659 1.234773e-03 0.0651697911
## drat 0.5717921 0.1999959326 0.016295731 1.970035e-01 0.0013361275
## wt 0.7916038 0.0542284172 0.073281663 1.630161e-02 0.0012578888
## qsec 0.2655437 0.5690984542 0.101947952 1.249426e-03 0.0060588455
## vs 0.6208539 0.1422249798 0.115330572 1.244460e-02 0.0803189801
## am 0.3647715 0.4887450097 0.026555457 2.501834e-04 0.0018011675
## gear 0.2829342 0.5665806069 0.052667265 1.888829e-02 0.0005219259
## carb 0.3026882 0.4533387304 0.175213444 4.333912e-03 0.0291718181
O mtcars_pca\(var\)contrib demonstra as contribuições em porcentagem de todas as variáveis na determinação da componente principal, enquanto a função dimdesc() mostra as variáveis mais correlacionadas às primeiras componentes principais.
mtcars_pca$var$contrib
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg 13.142837 0.02599962 5.0960440 5.080631e-02 1.0577029
## cyl 13.981320 0.19135124 3.0734010 6.717622e-04 0.3420355
## disp 13.556034 0.24328694 0.3780299 6.584761e+00 15.5232297
## hp 10.893757 6.18934888 1.9604134 4.580062e-01 29.1651238
## drat 8.652504 7.54568403 2.5981826 7.307322e+01 0.5979507
## wt 11.978751 2.04599412 11.6839894 6.046647e+00 0.5629370
## qsec 4.018275 21.47162226 16.2545274 4.634414e-01 2.7114861
## vs 9.394919 5.36603293 18.3882452 4.615993e+00 35.9447677
## am 5.519816 18.43995209 4.2339880 9.279888e-02 0.8060678
## gear 4.281433 21.37662593 8.3972408 7.006107e+00 0.2335750
## carb 4.580356 17.10410194 27.9359384 1.607550e+00 13.0551238
dimdesc(mtcars_pca)
## $Dim.1
## $Dim.1$quanti
## correlation p.value
## cyl 0.9612188 2.471950e-18
## disp 0.9464866 2.804047e-16
## wt 0.8897212 9.780198e-12
## hp 0.8484710 8.622043e-10
## carb 0.5501711 1.105272e-03
## qsec -0.5153093 2.542578e-03
## gear -0.5319156 1.728737e-03
## am -0.6039632 2.520665e-04
## drat -0.7561693 5.575736e-07
## vs -0.7879428 8.658012e-08
## mpg -0.9319502 9.347042e-15
##
##
## $Dim.2
## $Dim.2$quanti
## correlation p.value
## gear 0.7527155 6.712704e-07
## am 0.6991030 8.541542e-06
## carb 0.6733043 2.411011e-05
## drat 0.4472090 1.028069e-02
## hp 0.4050268 2.147312e-02
## vs -0.3771273 3.335771e-02
## qsec -0.7543861 6.138696e-07
##
##
## $Dim.3
## $Dim.3$quanti
## correlation p.value
## carb 0.418585 0.01711089
Legal, agora estamos prontos para aplicar tudo isso em outro dataset!
Como vimos anteriormente, o FactoMineR é um pacote muito útil, rico em funcionalidades, que implementa vários métodos de redução de dimensionalidade. Sua função para fazer a PCA é PCA(). Lembre-se que a PCA(), por padrão, gera 2 gráficos e extrai os 5 primeiras componentes principais. Você pode usar o argumento ncp para definir manualmente o número de dimensões a serem mantidas.
Você também pode usar a função summary() para obter uma rápida visão geral dos índices das três primeiras componentes principais. Além disso, para extrair sumários de algumas das linhas em um conjunto de dados, você pode especificar o argumento nbelements.
# carregando o dataset cars
cars <- read.csv("cars.csv", sep = ";")
rownames(cars) <- cars$Model
# rodando a PCA para do dataset cars
pca_output_ten_v <- PCA(cars[,9:19], ncp = 4, graph = FALSE)
# resumo dos 10 primeiros carros
summary(pca_output_ten_v, nbelements = 100)
##
## Call:
## PCA(X = cars[, 9:19], ncp = 4, graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6
## Variance 6.651 1.920 0.885 0.655 0.341 0.216
## % of var. 60.461 17.450 8.047 5.959 3.101 1.964
## Cumulative % of var. 60.461 77.911 85.958 91.917 95.018 96.982
## Dim.7 Dim.8 Dim.9 Dim.10 Dim.11
## Variance 0.140 0.089 0.064 0.037 0.001
## % of var. 1.276 0.812 0.584 0.338 0.007
## Cumulative % of var. 98.259 99.071 99.655 99.993 100.000
##
## Individuals (the 100 first)
## Dist Dim.1 ctr cos2
## Acura 3.5 RL 4dr | 1.958 | 1.444 0.081 0.544 |
## Acura 3.5 RL w/Navigation 4dr | 2.030 | 1.520 0.090 0.561 |
## Acura MDX | 1.963 | 1.360 0.072 0.480 |
## Acura NSX coupe 2dr manual S | 4.793 | 2.108 0.173 0.194 |
## Acura RSX Type S 2dr | 2.696 | -2.504 0.244 0.862 |
## Acura TL 4dr | 1.011 | 0.312 0.004 0.095 |
## Acura TSX 4dr | 1.726 | -1.472 0.084 0.728 |
## Audi A4 1.8T 4dr | 2.287 | -2.076 0.167 0.824 |
## Audi A4 3.0 4dr | 0.907 | -0.374 0.005 0.170 |
## Audi A4 3.0 convertible 2dr | 1.090 | 0.217 0.002 0.040 |
## Audi A4 3.0 Quattro 4dr auto | 1.077 | 0.076 0.000 0.005 |
## Audi A4 3.0 Quattro 4dr manual | 1.110 | 0.028 0.000 0.001 |
## Audi A4 3.0 Quattro convertible 2dr | 1.425 | 0.600 0.014 0.178 |
## Audi A41.8T convertible 2dr | 2.150 | -1.548 0.093 0.518 |
## Audi A6 2.7 Turbo Quattro 4dr | 1.459 | 0.882 0.030 0.366 |
## Audi A6 3.0 4dr | 0.881 | 0.292 0.003 0.109 |
## Audi A6 3.0 Avant Quattro | 1.366 | 0.877 0.030 0.412 |
## Audi A6 3.0 Quattro 4dr | 1.232 | 0.768 0.023 0.389 |
## Audi A6 4.2 Quattro 4dr | 2.865 | 2.552 0.253 0.793 |
## Audi A8 L Quattro 4dr | 4.642 | 4.126 0.661 0.790 |
## Audi RS 6 4dr | 5.572 | 4.515 0.792 0.656 |
## Audi S4 Avant Quattro | 3.343 | 2.540 0.251 0.577 |
## Audi S4 Quattro 4dr | 3.422 | 2.574 0.257 0.566 |
## Audi TT 1.8 convertible 2dr (coupe) | 3.299 | -2.193 0.187 0.442 |
## Audi TT 1.8 Quattro 2dr (convertible) | 3.267 | -1.992 0.154 0.372 |
## Audi TT 3.2 coupe 2dr (convertible) | 2.723 | -0.726 0.020 0.071 |
## BMW 325Ci 2dr | 2.106 | -0.513 0.010 0.059 |
## BMW 325Ci convertible 2dr | 2.065 | 0.047 0.000 0.001 |
## BMW 325i 4dr | 2.142 | -0.589 0.013 0.076 |
## BMW 325xi 4dr | 1.225 | -0.598 0.014 0.238 |
## BMW 325xi Sport | 1.225 | -0.401 0.006 0.107 |
## BMW 330Ci 2dr | 2.020 | 0.015 0.000 0.000 |
## BMW 330Ci convertible 2dr | 2.067 | 0.580 0.013 0.079 |
## BMW 330i 4dr | 2.008 | -0.030 0.000 0.000 |
## BMW 330xi 4dr | 1.017 | -0.176 0.001 0.030 |
## BMW 525i 4dr | 2.277 | 0.499 0.010 0.048 |
## BMW 530i 4dr | 2.297 | 0.871 0.029 0.144 |
## BMW 545iA 4dr | 3.665 | 3.129 0.380 0.729 |
## BMW 745i 4dr | 4.594 | 4.091 0.650 0.793 |
## BMW 745Li 4dr | 5.172 | 4.543 0.802 0.772 |
## BMW M3 convertible 2dr | 3.254 | 2.123 0.175 0.426 |
## BMW M3 coupe 2dr | 2.930 | 1.644 0.105 0.315 |
## BMW X3 3.0i | 1.577 | 0.835 0.027 0.280 |
## BMW X5 4.4i | 3.702 | 3.285 0.419 0.787 |
## BMW Z4 convertible 2.5i 2dr | 3.073 | -1.110 0.048 0.131 |
## BMW Z4 convertible 3.0i 2dr | 3.027 | -0.607 0.014 0.040 |
## Buick Century Custom 4dr | 1.497 | -0.528 0.011 0.124 |
## Buick LeSabre Custom 4dr | 1.702 | 0.351 0.005 0.043 |
## Buick LeSabre Limited 4dr | 1.634 | 0.535 0.011 0.107 |
## Buick Park Avenue 4dr | 2.179 | 0.918 0.033 0.177 |
## Buick Park Avenue Ultra 4dr | 2.322 | 1.482 0.085 0.407 |
## Buick Rainier | 2.812 | 2.318 0.209 0.679 |
## Buick Regal GS 4dr | 1.419 | 0.560 0.012 0.156 |
## Buick Regal LS 4dr | 1.484 | -0.009 0.000 0.000 |
## Buick Rendezvous CX | 1.385 | 0.316 0.004 0.052 |
## Cadillac CTS VVT 4dr | 2.223 | 1.266 0.062 0.324 |
## Cadillac Deville 4dr | 3.297 | 2.737 0.291 0.689 |
## Cadillac Deville DTS 4dr | 3.539 | 3.041 0.359 0.739 |
## Cadillac Escaladet | 4.908 | 4.537 0.800 0.854 |
## Cadillac Seville SLS 4dr | 3.028 | 2.595 0.262 0.734 |
## Cadillac SRX V8 | 3.635 | 3.378 0.443 0.863 |
## Cadillac XLR convertible 2dr | 4.522 | 3.331 0.431 0.543 |
## Chevrolet Astro | 3.094 | 1.758 0.120 0.323 |
## Chevrolet Aveo 4dr | 4.327 | -4.281 0.712 0.979 |
## Chevrolet Aveo LS 4dr hatch | 4.757 | -4.523 0.795 0.904 |
## Chevrolet Cavalier 2dr | 3.395 | -3.218 0.402 0.899 |
## Chevrolet Cavalier 4dr | 3.358 | -3.184 0.394 0.899 |
## Chevrolet Cavalier LS 2dr | 3.346 | -3.165 0.389 0.894 |
## Chevrolet Corvette 2dr | 4.110 | 2.630 0.269 0.409 |
## Chevrolet Corvette convertible 2dr | 4.227 | 2.835 0.312 0.450 |
## Chevrolet Impala 4dr | 1.908 | -0.362 0.005 0.036 |
## Chevrolet Impala LS 4dr | 1.734 | 0.147 0.001 0.007 |
## Chevrolet Impala SS 4dr | 1.693 | 0.728 0.021 0.185 |
## Chevrolet Malibu 4dr | 2.617 | -2.349 0.214 0.805 |
## Chevrolet Malibu LS 4dr | 1.386 | -0.706 0.019 0.260 |
## Chevrolet Malibu LT 4dr | 1.471 | -0.777 0.023 0.279 |
## Chevrolet Malibu Maxx LS | 1.419 | -0.357 0.005 0.063 |
## Chevrolet Monte Carlo LS 2dr | 1.842 | -0.460 0.008 0.062 |
## Chevrolet Monte Carlo SS 2dr | 1.655 | 0.302 0.004 0.033 |
## Chevrolet Suburban 1500 LT | 5.837 | 4.884 0.927 0.700 |
## Chevrolet Tahoe LT | 4.466 | 3.983 0.617 0.796 |
## Chevrolet Tracker | 2.889 | -1.546 0.093 0.286 |
## Chevrolet TrailBlazer LT | 2.594 | 1.930 0.145 0.554 |
## Chevrolet Venture LS | 1.206 | 0.176 0.001 0.021 |
## Chrvsler PT Cruiser GT 4dr | 2.128 | -1.562 0.095 0.539 |
## Chrysler 300M 4dr | 1.623 | 0.813 0.026 0.251 |
## Chrysler 300M Special Edition 4dr | 1.638 | 0.971 0.037 0.352 |
## Chrysler Concorde LX 4dr | 2.192 | -0.044 0.000 0.000 |
## Chrysler Concorde LXi 4dr | 2.125 | 0.741 0.021 0.122 |
## Chrysler Crossfire 2dr | 3.273 | -0.402 0.006 0.015 |
## Chrysler Pacifica | 3.134 | 2.127 0.176 0.460 |
## Chrysler PT Cruiser 4dr | 2.575 | -2.369 0.218 0.846 |
## Chrysler PT Cruiser Limited 4dr | 2.466 | -2.247 0.196 0.830 |
## Chrysler Sebring 4dr | 2.216 | -1.773 0.122 0.640 |
## Chrysler Sebring convertible 2dr | 2.071 | -1.519 0.090 0.538 |
## Chrysler Sebring Limited convertible 2dr | 1.066 | -0.312 0.004 0.086 |
## Chrysler Sebring Touring 4dr | 1.294 | -0.674 0.018 0.271 |
## Chrysler Town and Country Limited | 2.609 | 1.732 0.117 0.441 |
## Chrysler Town and Country LX | 2.391 | 0.824 0.026 0.119 |
## CMC Yukon 1500 SLE | 4.053 | 3.448 0.462 0.723 |
## Dim.2 ctr cos2 Dim.3
## Acura 3.5 RL 4dr -0.894 0.108 0.209 | 0.126
## Acura 3.5 RL w/Navigation 4dr -0.804 0.087 0.157 | 0.144
## Acura MDX -0.464 0.029 0.056 | -0.930
## Acura NSX coupe 2dr manual S 4.065 2.224 0.719 | -0.124
## Acura RSX Type S 2dr 0.574 0.044 0.045 | -0.408
## Acura TL 4dr -0.154 0.003 0.023 | -0.076
## Acura TSX 4dr -0.152 0.003 0.008 | -0.245
## Audi A4 1.8T 4dr -0.036 0.000 0.000 | -0.283
## Audi A4 3.0 4dr 0.154 0.003 0.029 | -0.509
## Audi A4 3.0 convertible 2dr 0.352 0.017 0.104 | -0.490
## Audi A4 3.0 Quattro 4dr auto 0.124 0.002 0.013 | -0.982
## Audi A4 3.0 Quattro 4dr manual 0.094 0.001 0.007 | -0.975
## Audi A4 3.0 Quattro convertible 2dr 0.290 0.011 0.041 | -0.879
## Audi A41.8T convertible 2dr 0.143 0.003 0.004 | -0.186
## Audi A6 2.7 Turbo Quattro 4dr -0.220 0.007 0.023 | -0.298
## Audi A6 3.0 4dr -0.427 0.025 0.235 | 0.087
## Audi A6 3.0 Avant Quattro -0.488 0.032 0.128 | -0.326
## Audi A6 3.0 Quattro 4dr -0.481 0.031 0.153 | -0.311
## Audi A6 4.2 Quattro 4dr 0.010 0.000 0.000 | -0.178
## Audi A8 L Quattro 4dr -0.273 0.010 0.003 | 0.904
## Audi RS 6 4dr 1.907 0.489 0.117 | -0.318
## Audi S4 Avant Quattro 0.818 0.090 0.060 | -1.339
## Audi S4 Quattro 4dr 0.782 0.082 0.052 | -1.515
## Audi TT 1.8 convertible 2dr (coupe) 1.561 0.328 0.224 | -1.742
## Audi TT 1.8 Quattro 2dr (convertible) 1.777 0.425 0.296 | -1.644
## Audi TT 3.2 coupe 2dr (convertible) 1.800 0.436 0.437 | -1.262
## BMW 325Ci 2dr 0.991 0.132 0.222 | 0.529
## BMW 325Ci convertible 2dr 1.108 0.165 0.288 | 0.248
## BMW 325i 4dr 0.921 0.114 0.185 | 0.474
## BMW 325xi 4dr -0.102 0.001 0.007 | -0.681
## BMW 325xi Sport -0.059 0.000 0.002 | -0.777
## BMW 330Ci 2dr 1.356 0.248 0.451 | 0.667
## BMW 330Ci convertible 2dr 1.456 0.286 0.496 | 0.424
## BMW 330i 4dr 1.294 0.226 0.415 | 0.654
## BMW 330xi 4dr 0.321 0.014 0.099 | -0.308
## BMW 525i 4dr 0.373 0.019 0.027 | 1.188
## BMW 530i 4dr 0.706 0.067 0.094 | 1.540
## BMW 545iA 4dr 1.144 0.176 0.097 | 1.242
## BMW 745i 4dr 1.056 0.150 0.053 | 1.699
## BMW 745Li 4dr 0.689 0.064 0.018 | 2.166
## BMW M3 convertible 2dr 2.036 0.558 0.392 | -0.187
## BMW M3 coupe 2dr 1.837 0.454 0.393 | -0.102
## BMW X3 3.0i -0.361 0.018 0.052 | -1.056
## BMW X5 4.4i 0.020 0.000 0.000 | -0.739
## BMW Z4 convertible 2.5i 2dr 2.265 0.690 0.543 | -0.467
## BMW Z4 convertible 3.0i 2dr 2.661 0.953 0.773 | -0.197
## Buick Century Custom 4dr -1.135 0.173 0.575 | 0.393
## Buick LeSabre Custom 4dr -1.352 0.246 0.631 | 0.658
## Buick LeSabre Limited 4dr -1.122 0.170 0.472 | 0.704
## Buick Park Avenue 4dr -1.409 0.267 0.418 | 1.025
## Buick Park Avenue Ultra 4dr -1.184 0.189 0.260 | 0.772
## Buick Rainier -1.118 0.168 0.158 | -0.781
## Buick Regal GS 4dr -0.890 0.107 0.393 | 0.123
## Buick Regal LS 4dr -1.065 0.153 0.516 | 0.478
## Buick Rendezvous CX -1.200 0.194 0.750 | -0.237
## Cadillac CTS VVT 4dr 0.081 0.001 0.001 | 0.676
## Cadillac Deville 4dr -1.014 0.138 0.095 | 0.858
## Cadillac Deville DTS 4dr -0.744 0.075 0.044 | 0.892
## Cadillac Escaladet -1.193 0.192 0.059 | -0.592
## Cadillac Seville SLS 4dr -0.538 0.039 0.032 | 0.534
## Cadillac SRX V8 -0.703 0.066 0.037 | -0.172
## Cadillac XLR convertible 2dr 2.944 1.167 0.424 | 0.464
## Chevrolet Astro -1.727 0.402 0.312 | -1.545
## Chevrolet Aveo 4dr 0.412 0.023 0.009 | -0.134
## Chevrolet Aveo LS 4dr hatch 0.908 0.111 0.036 | -0.566
## Chevrolet Cavalier 2dr -0.349 0.016 0.011 | 0.820
## Chevrolet Cavalier 4dr -0.362 0.018 0.012 | 0.812
## Chevrolet Cavalier LS 2dr -0.275 0.010 0.007 | 0.835
## Chevrolet Corvette 2dr 1.754 0.414 0.182 | 0.418
## Chevrolet Corvette convertible 2dr 2.036 0.558 0.232 | 0.478
## Chevrolet Impala 4dr -1.427 0.274 0.559 | 0.937
## Chevrolet Impala LS 4dr -1.318 0.234 0.577 | 0.706
## Chevrolet Impala SS 4dr -1.182 0.188 0.488 | 0.337
## Chevrolet Malibu 4dr -0.724 0.071 0.077 | 0.556
## Chevrolet Malibu LS 4dr -0.698 0.066 0.254 | 0.215
## Chevrolet Malibu LT 4dr -0.525 0.037 0.127 | 0.522
## Chevrolet Malibu Maxx LS -1.046 0.147 0.543 | 0.513
## Chevrolet Monte Carlo LS 2dr -1.321 0.235 0.514 | 0.894
## Chevrolet Monte Carlo SS 2dr -1.337 0.241 0.653 | 0.272
## Chevrolet Suburban 1500 LT -3.002 1.213 0.264 | 0.735
## Chevrolet Tahoe LT -1.522 0.312 0.116 | -0.710
## Chevrolet Tracker 0.540 0.039 0.035 | -2.026
## Chevrolet TrailBlazer LT -1.318 0.234 0.258 | -0.761
## Chevrolet Venture LS -1.064 0.152 0.778 | -0.178
## Chrvsler PT Cruiser GT 4dr 0.407 0.022 0.037 | -1.079
## Chrysler 300M 4dr -1.109 0.166 0.467 | 0.281
## Chrysler 300M Special Edition 4dr -0.978 0.129 0.356 | 0.299
## Chrysler Concorde LX 4dr -1.649 0.366 0.566 | 0.970
## Chrysler Concorde LXi 4dr -1.585 0.338 0.556 | 0.666
## Chrysler Crossfire 2dr 2.417 0.787 0.545 | -1.177
## Chrysler Pacifica -0.789 0.084 0.063 | 0.665
## Chrysler PT Cruiser 4dr -0.049 0.000 0.000 | -0.843
## Chrysler PT Cruiser Limited 4dr 0.115 0.002 0.002 | -0.809
## Chrysler Sebring 4dr -1.030 0.143 0.216 | 0.205
## Chrysler Sebring convertible 2dr -0.816 0.090 0.155 | 0.220
## Chrysler Sebring Limited convertible 2dr -0.494 0.033 0.215 | 0.134
## Chrysler Sebring Touring 4dr -0.815 0.090 0.397 | 0.100
## Chrysler Town and Country Limited -1.666 0.374 0.408 | 0.460
## Chrysler Town and Country LX -2.056 0.569 0.739 | 0.563
## CMC Yukon 1500 SLE -1.758 0.416 0.188 | -0.454
## ctr cos2
## Acura 3.5 RL 4dr 0.005 0.004 |
## Acura 3.5 RL w/Navigation 4dr 0.006 0.005 |
## Acura MDX 0.252 0.224 |
## Acura NSX coupe 2dr manual S 0.004 0.001 |
## Acura RSX Type S 2dr 0.049 0.023 |
## Acura TL 4dr 0.002 0.006 |
## Acura TSX 4dr 0.017 0.020 |
## Audi A4 1.8T 4dr 0.023 0.015 |
## Audi A4 3.0 4dr 0.076 0.316 |
## Audi A4 3.0 convertible 2dr 0.070 0.202 |
## Audi A4 3.0 Quattro 4dr auto 0.281 0.832 |
## Audi A4 3.0 Quattro 4dr manual 0.278 0.772 |
## Audi A4 3.0 Quattro convertible 2dr 0.226 0.381 |
## Audi A41.8T convertible 2dr 0.010 0.007 |
## Audi A6 2.7 Turbo Quattro 4dr 0.026 0.042 |
## Audi A6 3.0 4dr 0.002 0.010 |
## Audi A6 3.0 Avant Quattro 0.031 0.057 |
## Audi A6 3.0 Quattro 4dr 0.028 0.064 |
## Audi A6 4.2 Quattro 4dr 0.009 0.004 |
## Audi A8 L Quattro 4dr 0.238 0.038 |
## Audi RS 6 4dr 0.030 0.003 |
## Audi S4 Avant Quattro 0.524 0.161 |
## Audi S4 Quattro 4dr 0.670 0.196 |
## Audi TT 1.8 convertible 2dr (coupe) 0.885 0.279 |
## Audi TT 1.8 Quattro 2dr (convertible) 0.789 0.253 |
## Audi TT 3.2 coupe 2dr (convertible) 0.465 0.215 |
## BMW 325Ci 2dr 0.082 0.063 |
## BMW 325Ci convertible 2dr 0.018 0.014 |
## BMW 325i 4dr 0.065 0.049 |
## BMW 325xi 4dr 0.135 0.309 |
## BMW 325xi Sport 0.176 0.403 |
## BMW 330Ci 2dr 0.130 0.109 |
## BMW 330Ci convertible 2dr 0.052 0.042 |
## BMW 330i 4dr 0.125 0.106 |
## BMW 330xi 4dr 0.028 0.092 |
## BMW 525i 4dr 0.412 0.272 |
## BMW 530i 4dr 0.692 0.450 |
## BMW 545iA 4dr 0.450 0.115 |
## BMW 745i 4dr 0.843 0.137 |
## BMW 745Li 4dr 1.370 0.175 |
## BMW M3 convertible 2dr 0.010 0.003 |
## BMW M3 coupe 2dr 0.003 0.001 |
## BMW X3 3.0i 0.325 0.448 |
## BMW X5 4.4i 0.159 0.040 |
## BMW Z4 convertible 2.5i 2dr 0.064 0.023 |
## BMW Z4 convertible 3.0i 2dr 0.011 0.004 |
## Buick Century Custom 4dr 0.045 0.069 |
## Buick LeSabre Custom 4dr 0.126 0.150 |
## Buick LeSabre Limited 4dr 0.145 0.186 |
## Buick Park Avenue 4dr 0.307 0.221 |
## Buick Park Avenue Ultra 4dr 0.174 0.111 |
## Buick Rainier 0.178 0.077 |
## Buick Regal GS 4dr 0.004 0.007 |
## Buick Regal LS 4dr 0.067 0.104 |
## Buick Rendezvous CX 0.016 0.029 |
## Cadillac CTS VVT 4dr 0.133 0.092 |
## Cadillac Deville 4dr 0.215 0.068 |
## Cadillac Deville DTS 4dr 0.232 0.064 |
## Cadillac Escaladet 0.102 0.015 |
## Cadillac Seville SLS 4dr 0.083 0.031 |
## Cadillac SRX V8 0.009 0.002 |
## Cadillac XLR convertible 2dr 0.063 0.011 |
## Chevrolet Astro 0.697 0.249 |
## Chevrolet Aveo 4dr 0.005 0.001 |
## Chevrolet Aveo LS 4dr hatch 0.093 0.014 |
## Chevrolet Cavalier 2dr 0.196 0.058 |
## Chevrolet Cavalier 4dr 0.192 0.058 |
## Chevrolet Cavalier LS 2dr 0.204 0.062 |
## Chevrolet Corvette 2dr 0.051 0.010 |
## Chevrolet Corvette convertible 2dr 0.067 0.013 |
## Chevrolet Impala 4dr 0.256 0.241 |
## Chevrolet Impala LS 4dr 0.146 0.166 |
## Chevrolet Impala SS 4dr 0.033 0.040 |
## Chevrolet Malibu 4dr 0.090 0.045 |
## Chevrolet Malibu LS 4dr 0.013 0.024 |
## Chevrolet Malibu LT 4dr 0.079 0.126 |
## Chevrolet Malibu Maxx LS 0.077 0.131 |
## Chevrolet Monte Carlo LS 2dr 0.233 0.235 |
## Chevrolet Monte Carlo SS 2dr 0.022 0.027 |
## Chevrolet Suburban 1500 LT 0.158 0.016 |
## Chevrolet Tahoe LT 0.147 0.025 |
## Chevrolet Tracker 1.198 0.492 |
## Chevrolet TrailBlazer LT 0.169 0.086 |
## Chevrolet Venture LS 0.009 0.022 |
## Chrvsler PT Cruiser GT 4dr 0.340 0.257 |
## Chrysler 300M 4dr 0.023 0.030 |
## Chrysler 300M Special Edition 4dr 0.026 0.033 |
## Chrysler Concorde LX 4dr 0.275 0.196 |
## Chrysler Concorde LXi 4dr 0.129 0.098 |
## Chrysler Crossfire 2dr 0.404 0.129 |
## Chrysler Pacifica 0.129 0.045 |
## Chrysler PT Cruiser 4dr 0.207 0.107 |
## Chrysler PT Cruiser Limited 4dr 0.191 0.108 |
## Chrysler Sebring 4dr 0.012 0.009 |
## Chrysler Sebring convertible 2dr 0.014 0.011 |
## Chrysler Sebring Limited convertible 2dr 0.005 0.016 |
## Chrysler Sebring Touring 4dr 0.003 0.006 |
## Chrysler Town and Country Limited 0.062 0.031 |
## Chrysler Town and Country LX 0.093 0.055 |
## CMC Yukon 1500 SLE 0.060 0.013 |
##
## Variables
## Dim.1 ctr cos2 Dim.2
## RWD | 0.385 2.229 0.148 | 0.570
## Retail.Price | 0.756 8.598 0.572 | 0.559
## Dealer.Cost | 0.753 8.526 0.567 | 0.561
## Engine.Size..l. | 0.920 12.734 0.847 | -0.100
## Cyl | 0.904 12.294 0.818 | 0.035
## HP | 0.882 11.709 0.779 | 0.305
## City.MPG | -0.827 10.296 0.685 | 0.124
## Hwy.MPG | -0.815 9.980 0.664 | 0.127
## Weight | 0.861 11.145 0.741 | -0.348
## Wheel.Base | 0.658 6.513 0.433 | -0.603
## Len | 0.630 5.976 0.397 | -0.589
## ctr cos2 Dim.3 ctr
## RWD 16.909 0.325 | 0.342 13.175
## Retail.Price 16.304 0.313 | 0.079 0.712
## Dealer.Cost 16.411 0.315 | 0.081 0.749
## Engine.Size..l. 0.522 0.010 | 0.067 0.502
## Cyl 0.065 0.001 | 0.101 1.152
## HP 4.836 0.093 | -0.003 0.001
## City.MPG 0.803 0.015 | 0.438 21.685
## Hwy.MPG 0.834 0.016 | 0.514 29.864
## Weight 6.318 0.121 | -0.110 1.378
## Wheel.Base 18.934 0.363 | 0.343 13.291
## Len 18.065 0.347 | 0.393 17.491
## cos2
## RWD 0.117 |
## Retail.Price 0.006 |
## Dealer.Cost 0.007 |
## Engine.Size..l. 0.004 |
## Cyl 0.010 |
## HP 0.000 |
## City.MPG 0.192 |
## Hwy.MPG 0.264 |
## Weight 0.012 |
## Wheel.Base 0.118 |
## Len 0.155 |
# variância das 3 primeiras dimensões
pca_output_ten_v$eig[,2][1:3]
## comp 1 comp 2 comp 3
## 60.460594 17.450472 8.046992
# variância acumulada
pca_output_ten_v$eig[,3][1:3]
## comp 1 comp 2 comp 3
## 60.46059 77.91107 85.95806
A função PCA() fornece grande flexibilidade em seu uso. Você pode optar por ignorar algumas das variáveis ou indivíduos originais na construção de um modelo de PCA fornecendo à PCA() o argumento ind.sup para indivíduos suplementares e quanti.sup ou quali.sup para variáveis quantitativas e qualitativas, respectivamente. Indivíduos e variáveis suplementares são linhas e variáveis dos dados originais ignorados durante a construção do modelo.
Nosso objetivo de aprendizado neste exercício são:
conduzir a PCA considerando partes de um conjunto de dados;
inspecionar as variáveis mais correlacionadas com uma componente principal especificada;
encontrar a contribuição de variáveis na designação das primeiras 5 componentes principais;
# rodando a PCA com as variáveis ativas e suplementares
pca_output_all <- PCA(cars[,-1], quanti.sup = 1:8, quali.sup = 20:21, graph = FALSE)
# variáveis mais correlacionadas
dimdesc(pca_output_all, axes = 1:2)
## $Dim.1
## $Dim.1$quanti
## correlation p.value
## <NA> NA NA
## Engine.Size..l. 0.9251267 5.116179e-164
## Weight 0.8964700 3.638599e-138
## Cyl 0.8907643 6.262131e-134
## HP 0.8492193 8.059693e-109
## Width 0.7891195 1.664116e-83
## Wheel.Base 0.7095703 1.671006e-60
## Retail.Price 0.7030143 5.914584e-59
## Dealer.Cost 0.6991979 4.510056e-58
## Len 0.6844621 8.580649e-55
## SUV 0.3149124 2.343396e-10
## RWD 0.3064581 7.365567e-10
## AWD 0.2192594 1.346164e-05
## Minivan 0.1435461 4.663306e-03
## Small.Sporty..Compact.Large.Sedan -0.3062320 7.590854e-10
## Hwy.MPG -0.8171975 3.651747e-94
## City.MPG -0.8275744 1.404114e-98
##
## $Dim.1$quali
## R2 p.value
## type 0.1505098 8.763997e-13
##
## $Dim.1$category
## Estimate p.value
## SUV 1.414274 2.343396e-10
## Minivan 1.074161 4.663306e-03
## Small.Sporty..Compact.Large.Sedan -1.224868 7.590854e-10
##
##
## $Dim.2
## $Dim.2$quanti
## correlation p.value
## <NA> NA NA
## Wheel.Base 0.5739738 2.730836e-35
## Len 0.5605697 2.095168e-33
## Width 0.4294626 8.445613e-19
## Minivan 0.3206132 1.060475e-10
## Weight 0.2298540 4.913548e-06
## SUV 0.1675328 9.379368e-04
## Small.Sporty..Compact.Large.Sedan 0.1164972 2.189605e-02
## Cyl -0.1071037 3.518485e-02
## RWD -0.3862412 3.231605e-15
## HP -0.4010809 2.175520e-16
## Sports.Car -0.5919253 5.917164e-38
## Retail.Price -0.6430569 1.540011e-46
## Dealer.Cost -0.6453051 5.917390e-47
##
## $Dim.2$quali
## R2 p.value
## type 0.43630221 2.376020e-46
## wheeltype 0.01220005 2.981756e-02
##
## $Dim.2$category
## Estimate p.value
## Minivan 1.81590533 1.060475e-10
## SUV 0.47299804 9.379368e-04
## Small.Sporty..Compact.Large.Sedan 0.06011519 2.189605e-02
## AWD 0.15182838 2.981756e-02
## RWD -0.15182838 2.981756e-02
## Sports.Car -2.30896125 5.917164e-38
# rodando a PCA das 100 primeiras categorias
pca_output_hundred <- PCA(cars[,-1], quanti.sup = 1:8, quali.sup = 20:21, ind.sup = 101:nrow(cars), graph = FALSE)
# verificando a contribuição das variáveis nas componentes principais
pca_output_hundred$var$contrib
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Retail.Price 7.965614 15.8024853 11.2763607 9.1124818 0.3138074
## Dealer.Cost 7.855730 15.8618467 11.9167330 9.6039013 0.1695028
## Engine.Size..l. 11.083501 0.7001569 0.1640554 35.3310835 0.5255481
## Cyl 11.259710 0.5467582 1.2272233 23.7960494 3.7712075
## HP 10.561974 6.9640901 1.6662329 4.6961501 0.3014089
## City.MPG 11.244641 0.8281113 15.8614982 0.5617910 2.4644895
## Hwy.MPG 9.555123 1.1117234 32.9318225 1.4940337 3.5605364
## Weight 10.875833 3.4506953 6.7832841 8.7492012 0.4919353
## Wheel.Base 6.703155 19.8439686 5.9104923 5.4731013 9.0895691
## Len 4.560931 26.6713824 11.6240467 0.5134301 3.9742305
## Width 8.333788 8.2187818 0.6382508 0.6687766 75.3377646
Usamos os argumentos mais importantes da função PCA(), quali.sup, quanti.sup e ind.sup.
Agora que temos uma experiência prática com o FactoMineR, vamos dar uma olhada no ade4, um pacote do R bem conhecido e bem mantido com um grande número de métodos numéricos para construir e manipular modelos de PCA. dudi.pca() é a função principal que implementa o PCA para ade4 e, por padrão, é interativo: permite que o usuário insira o número de dimensões retidas. Para suprimir o modo interativo e inserir o número de eixos dentro da função dudi.pca(), você precisa definir o argumento scannf como FALSE e depois usar o argumento nf para configurar o número de eixos a serem retidos.
Vamos colocar o ade4 em prática e compará-lo com o FactoMineR!
# carregando o pacote ade4
library(ade4)
# rodando a PCA usando variáveis numéricas não-binárias
cars_pca <- dudi.pca(cars[,9:19], scannf = FALSE, nf = 4)
# resumo do cars_pca
summary(cars_pca)
## Class: pca dudi
## Call: dudi.pca(df = cars[, 9:19], scannf = FALSE, nf = 4)
##
## Total inertia: 11
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 6.6507 1.9196 0.8852 0.6555 0.3411
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 60.461 17.450 8.047 5.959 3.101
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 60.46 77.91 85.96 91.92 95.02
##
## (Only 5 dimensions (out of 11) are shown)
# resumo do pca_output_ten_v
summary(pca_output_ten_v)
##
## Call:
## PCA(X = cars[, 9:19], ncp = 4, graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6
## Variance 6.651 1.920 0.885 0.655 0.341 0.216
## % of var. 60.461 17.450 8.047 5.959 3.101 1.964
## Cumulative % of var. 60.461 77.911 85.958 91.917 95.018 96.982
## Dim.7 Dim.8 Dim.9 Dim.10 Dim.11
## Variance 0.140 0.089 0.064 0.037 0.001
## % of var. 1.276 0.812 0.584 0.338 0.007
## Cumulative % of var. 98.259 99.071 99.655 99.993 100.000
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2
## Acura 3.5 RL 4dr | 1.958 | 1.444 0.081 0.544 | -0.894
## Acura 3.5 RL w/Navigation 4dr | 2.030 | 1.520 0.090 0.561 | -0.804
## Acura MDX | 1.963 | 1.360 0.072 0.480 | -0.464
## Acura NSX coupe 2dr manual S | 4.793 | 2.108 0.173 0.194 | 4.065
## Acura RSX Type S 2dr | 2.696 | -2.504 0.244 0.862 | 0.574
## Acura TL 4dr | 1.011 | 0.312 0.004 0.095 | -0.154
## Acura TSX 4dr | 1.726 | -1.472 0.084 0.728 | -0.152
## Audi A4 1.8T 4dr | 2.287 | -2.076 0.167 0.824 | -0.036
## Audi A4 3.0 4dr | 0.907 | -0.374 0.005 0.170 | 0.154
## Audi A4 3.0 convertible 2dr | 1.090 | 0.217 0.002 0.040 | 0.352
## ctr cos2 Dim.3 ctr cos2
## Acura 3.5 RL 4dr 0.108 0.209 | 0.126 0.005 0.004 |
## Acura 3.5 RL w/Navigation 4dr 0.087 0.157 | 0.144 0.006 0.005 |
## Acura MDX 0.029 0.056 | -0.930 0.252 0.224 |
## Acura NSX coupe 2dr manual S 2.224 0.719 | -0.124 0.004 0.001 |
## Acura RSX Type S 2dr 0.044 0.045 | -0.408 0.049 0.023 |
## Acura TL 4dr 0.003 0.023 | -0.076 0.002 0.006 |
## Acura TSX 4dr 0.003 0.008 | -0.245 0.017 0.020 |
## Audi A4 1.8T 4dr 0.000 0.000 | -0.283 0.023 0.015 |
## Audi A4 3.0 4dr 0.003 0.029 | -0.509 0.076 0.316 |
## Audi A4 3.0 convertible 2dr 0.017 0.104 | -0.490 0.070 0.202 |
##
## Variables (the 10 first)
## Dim.1 ctr cos2 Dim.2 ctr
## RWD | 0.385 2.229 0.148 | 0.570 16.909
## Retail.Price | 0.756 8.598 0.572 | 0.559 16.304
## Dealer.Cost | 0.753 8.526 0.567 | 0.561 16.411
## Engine.Size..l. | 0.920 12.734 0.847 | -0.100 0.522
## Cyl | 0.904 12.294 0.818 | 0.035 0.065
## HP | 0.882 11.709 0.779 | 0.305 4.836
## City.MPG | -0.827 10.296 0.685 | 0.124 0.803
## Hwy.MPG | -0.815 9.980 0.664 | 0.127 0.834
## Weight | 0.861 11.145 0.741 | -0.348 6.318
## Wheel.Base | 0.658 6.513 0.433 | -0.603 18.934
## cos2 Dim.3 ctr cos2
## RWD 0.325 | 0.342 13.175 0.117 |
## Retail.Price 0.313 | 0.079 0.712 0.006 |
## Dealer.Cost 0.315 | 0.081 0.749 0.007 |
## Engine.Size..l. 0.010 | 0.067 0.502 0.004 |
## Cyl 0.001 | 0.101 1.152 0.010 |
## HP 0.093 | -0.003 0.001 0.000 |
## City.MPG 0.015 | 0.438 21.685 0.192 |
## Hwy.MPG 0.016 | 0.514 29.864 0.264 |
## Weight 0.121 | -0.110 1.378 0.012 |
## Wheel.Base 0.363 | 0.343 13.291 0.118 |
Agora que sabemos como conduzir a PCA com a função dudi.pca() do ade4!
Depois de criar seu primeiro modelo de PCA, você precisa ser capaz de interpretá-los apropriadamente. Interpretar os índices numéricos de PCA resultantes, os mais proeminentes dos quais são cossenos quadrados e contribuições, não é uma tarefa fácil e pode ser facilitada com o aspecto visual de mapas de fatores. Como você viu no vídeo anterior, a função PCA do FactorMineR exibe dois gráficos por padrão, os mapas do indivíduo e do fator. No entanto, aqui podemos usar factextra, um pacote de wrap-up que fornece visualizações do tipo ggplot2 de objetos do modelo PCA produzidos por vários pacotes R, incluindo o FactoMineR. A função fviz_pca_var() gera representações das contribuições das variáveis na construção dos componentes principais.
# carregando o pacote factoextra
library(factoextra)
Neste primeiro trecho de código, usamos os argumentos col.vars, para procurar variáveis de contribuição, gradient.cols para criar o efeito de gradiece na coloração das contribuições e repel para evitar a confusão de pontos.
fviz_pca_var(mtcars_pca,
col.var = "contrib",
gradient.cols = c("#bb2e00", "#002bbb"),
repel = TRUE)
Para exibir a contribuição de variáveis selecionadas, ou seja, o top 4 em contribuição, em vez de col.var, fornecemos uma lista para o argumento select.var.
fviz_pca_var(mtcars_pca,
select.var = list(contrib = 4),
repel = TRUE)
Por último, fviz_contrib() produz barplots de individulas ou variáveis de contribuições (como no pedaço de código aqui). A linha vermelha corresponde à porcentagem esperada se a distribuição das contribuições fosse uniforme.
fviz_contrib(mtcars_pca,
choice = "var",
axes = 1,
top = 5)
Um outro índice importante para interpretar modelos de PCA é o cosseno quadrado, abreviado como cos2 em FactoMineR e factextra. Esse índice reflete a precisão da representação de nossas variáveis ou indivíduos no plano da componente principal. Para plotar o cos2 dos indivíduos para mtcars_pca, precisamos apenas ajustar a função fviz_pca_ind(), ajustando o argumento col.ind para todos os indivíduos
fviz_pca_ind(mtcars_pca,
col.ind = "cos2",
gradient.cols = c("#bb2e00", "#002bbb"),
repel = TRUE)
O argumento select.ind serve para visualizarmos indivíduos com um cos2 maior que um valor de 0,8, como exemplo.
fviz_pca_ind(mtcars_pca,
select.ind = list(cos2 = 0.8),
gradient.cols = c("#bb2e00", "#002bbb"),
repel = TRUE)
A função fviz_cos2() tem como output um gráfico de barras com a qualidade da representação de cada indivíduo.
fviz_cos2(mtcars_pca,
choice = "ind",
axes = 1,
top = 10)
Os biplots são gráficos que oferecem um jeito compacto de resumir as relações entre indivíduos, entre as variáveis, e também entre as variáveis e os indivíduos, isso tudo no mesmo gráfico! Por exemplo, aplicando a função fviz_pca_biplot() do pacote factoextra no objeto mtcars_pca, a interpretação das componentes principais agora fornece melhores informações e é muito mais fácil.
fviz_pca_biplot(mtcars_pca)
Os carros localizados no canto à esquerda, como o Toyota Corona, na verdade são econômicos, mais lentos, com menos engrenagens e possuem transmissão automática, enquanto no lado superior direito encontramos o oposto, no caso o Maseratti, no qual é muito potente. O FactorMineR é flexível o suficiente para aplicar a PCA em subconjuntos de nossos dados, nesse caso, algumas variáveis qualitativas ou indivíduos podem ser consideradas complementares e não serem exploradas para a construção das componentes principais. Essa informação suplementar pode ser usada para adicionar elipsóides no biplot no qual permite avançarmos ainda mais na interpretação.
Antes de usar fviz_pca_ind(), precisamos ter certeza de que há pelo menos uma variável qualitativa e que faz sentido usá-la como uma variável suplementar. A variável cyl (número de cilindros) é do tipo numérico, mas possui alguns valores e pode ser considerada como variável qualitativa, após ser convertida em um fator.
mtcars$cyl <- as.factor(mtcars$cyl)
Agora podemos usar o argumento addEllipses da função fviz_pca_ind() para criar as elipses e explorar os níveis da variável suplementar cyl para atribuir cores aos indivíduos. Parece que o cyl tem poder discriminativo suficiente para expressar as diferenças de valor na primeira componente principal.
fviz_pca_ind(mtcars_pca,
label = "var",
habillage = mtcars$cyl,
addEllipses = TRUE)
Como vimos anteriormente, um índice importante nos modelos de PCA é o cosseno ao quadrado, abreviado em FactoMineR e factextra como cos2, ele mostra a precisão da representação de suas variáveis ou indivíduos no plano das componentes principais.
O pacote factextra é excelente para lidar com modelos de PCA construídos com o FactoMineR. Aqui, você vai explorar a funcionalidade do factoextra. Usaremos o objeto pca_output_all para criar gráficos baseados no cos2, visualizações são fundamentais para entender o cos2.
# criando um mapa de fatores
fviz_pca_var(pca_output_all, select.var = list(cos2 = 0.7), repel = TRUE)
# modificando o código para criar uma mapa de fatores dos invíduos
fviz_pca_ind(pca_output_all, select.ind = list(cos2 = 0.7), repel = TRUE)
# criando gráfico de barras para as variáveis com maior cos2 na primeira componente principal
fviz_cos2(pca_output_all, choice = "var", axes = 1, top = 10)
# criando gráfico de barras para as variáveis com maior cos2 na segunda componente principal
fviz_cos2(pca_output_all, choice = "var", axes = 2, top = 10)
Legal! Agora uma questão: o que o cos2 nos conta sobre a nova representação fornecida por seus modelos? Você pode dizer se eles são bons o suficiente em qualidade?
Agora vamos preparar um número de gráficos para ajudá-lo a ter uma melhor percepção das contribuições das variáveis nas componentes principais extraídos. É importante ter em mente que as contribuições das variáveis significam, essencialmente, sua importância para a construção de um determinado componente principal.
# criando um mapa de fator para as top 5 variáveis com maiores contribuições
fviz_pca_var(pca_output_all, select.var = list(contrib = 5), repel = TRUE)
# criando um mapa de fator para os top 5 indivíduos com maiores contribuições
fviz_pca_ind(pca_output_all, select.ind = list(contrib = 5), repel = TRUE)
# criando um gráfico de barras pra as variáveis com maiores contribuições na primeira componente principal
fviz_contrib(pca_output_all, choice = "var", axes = 1, top = 5)
# criando um gráfico de barras pra as variáveis com maiores contribuições na segunda componente principal
fviz_contrib(pca_output_all, choice = "var", axes = 2, top = 5)
Ótimo! Agora podemos entender a importância de uma variável na extração dos componentes principais! Você pode comparar os dois gráficos. Quais variáveis que estão em ambas as dimensões e quais estão em apenas em uma delas?
Como mencionado anteriormente, os biplots são gráficos que fornecem uma maneira compacta e resume as relações entre indivíduos, variáveis e também entre variáveis e indivíduos. Além disso, os elipsóides podem ser adicionados em cima de um biplot e oferecem uma visão geral muito melhor do biplot com base nos agrupamentos de variáveis e indivíduos.
# criando um biplot
fviz_pca_biplot(pca_output_all)
# criando elipsóides
fviz_pca_ind(pca_output_all, habillage = cars$wheeltype, addEllipses = TRUE)
# biplots com elipsóides
fviz_pca_biplot(pca_output_all, habillage = cars$wheeltype, addEllipses = TRUE, alpha.var = "cos2")
Pergunta! O que significa quando duas variáveis estão próximas umas das outras em um biplot?
R: Ambas variáveis possuem distância euclidiana pequena.